package com.camemax.netty.nio;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * Channel本地文件写测试：
 * 使用ByteBuffer（缓冲）与FileChannel（通道），完成"Hello,尚硅谷！"写入文件file01.txt
 * Buffer => Channel => File
 * ByteBuffer => FileChannel => FileOutputStream
 */
// NIO模型中的重要组件——Channel
public class NIOChannelForWrite {
    static String NIO_FILE_PATH = "D:\\Javas\\netty\\files\\file01.txt";
    public static void main(String[] args) {
        // 1、创建ByteBuffer（二进制流为底层通讯基础）
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        // 2、缓存区缓存指定数据（以二进制形式）
        String str = "Hello,尚硅谷!";
        buffer.put(str.getBytes()); // 缓存填充

        // 3、缓冲切换
        buffer.flip();

        // 4、使用文件输出流创建文件
        File file = new File(NIO_FILE_PATH); // 创建文件对象

        System.out.println("检测文件父路径是否存在...");
        // 4.2、使用File进行文件检查（FileOutputStream无法在多层路径缺失的情况下创建文件）
        FilePathCheck.checkDirectories(file);

        try {
            // 基于文件夹存在时，文件不存在则自动创建文件；文件存在时覆盖
            FileOutputStream fileStream = new FileOutputStream(file);
            FileChannel channel = fileStream.getChannel();// 文件输出流获取通道
            // 4.2 将buffer中的内容写入到channel中
            channel.write(buffer);
            System.out.println("文件写入完成!");
            // 5、 关闭文件输出流
            fileStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
